.TITLE PPDRV .IDENT /03.01/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; VERSION 03.01 ; ; THOMAS J. MILLER 25-NOV-74 ; ; PREVIOUSLY MODIFIED BY: ; ; C. A. D'ELIA ; T. J. MILLER ; ; MODIFIED BY: ; ; K. E. KINNEAR 22-JUN-77 ; ; KK004 -- NEW I/O DATA BASE SUPPORT. ; ; E. L. BAATZ 18-JUN-78 ; ; EB148 -- REMOVE EXPLICIT PS REFERENCE ; ; PC11 PAPER TAPE PUNCH DRIVER ; ; MACRO LIBRARY CALLS ; .MCALL ABODF$,HWDDF$,PKTDF$,TCBDF$ ABODF$ ;DEFINE TASK ABORT CODES HWDDF$ ;DEFINE HARDWARE REGISTER SYMBOLS PKTDF$ ;DEFINE I/O PACKET OFFSETS TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS ; ; EQUATED SYMBOLS ; ; PAPER TAPE PUNCH STATUS WORD BIT DEFINITIONS (U.CW2) ; WAIT=100000 ;WAITING FOR DEVICE TO COME ON-LINE (1=YES) ABORT=40000 ;ABORT CURRENT I/O REQUEST (1=YES) TRAIL=200 ;CURRENTLY PUNCHING TRAILER (1=YES) ; ;**-16 ; DRIVER DISPATCH TABLE ; ; KK004 DDT$ PP,P$$P11 ; KK004 ;**-4 ;+ ; **-PPINI-PC11 PAPER TAPE PUNCH CONTROLLER INITIATOR ; ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUEST ; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THE EXECU- ; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN ATTEMPT ; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER IS ; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER- ; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED. ; ; INPUTS: ; ; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED. ; ; OUTPUTS: ; ; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAIT- ; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER- ; ATION IS INITIATED. ;- .ENABL LSB PPINI: GTPKT$ PP,P$$P11,PPPWF,,T ; KK004 ;**-2 ; ; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT: ; ; R1=ADDRESS OF THE I/O REQUEST PACKET. ; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB. ; R3=CONTROLLER INDEX. ; R4=ADDRESS OF THE STATUS CONTROL BLOCK. ; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED. ; ; PAPER TAPE PUNCH I/O REQUEST PACKET FORMAT: ; ; WD. 00 -- I/O QUEUE THREAD WORD. ; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER. ; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTER TASK. ; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTER TASK HEADER. ; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTER TASK HEADER (UCB). ; WD. 05 -- I/O FUNCTION CODE (IO.WLB, IO.ATT OR IO.DET). ; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK. ; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK. ; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140000). ; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE. ; WD. 12 -- RELOCATION BIAS OF I/O BUFFER. ; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER. ; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED. ; WD. 15 -- NOT USED. ; WD. 16 -- NOT USED. ; WD. 17 -- NOT USED. ; WD. 20 -- NOT USED. ; CLR U.CW2(R5) ;CLEAR ALL SWITCHES ;**-1 CMPB I.FCN+1(R1),#IO.WLB/256. ;WRITE LOGICAL BLOCK FUNCTION? BEQ 10$ ;IF EQ YES MOV I.TCB(R1),R0 ;GET REQUESTOR TCB ADDRESS BIT #T2.ABO,T.ST2(R0) ;TASK BEING ABORTED? BNE 65$ ;IF NE YES - DON'T PUNCH TRAILER BIS #TRAIL,U.CW2(R5) ;OTHERWISE FUNCTION IS ATTACH OR DETACH ; SET FLAG TO PUNCH TRAILER MOV #170.,U.CNT(R5) ;SET COUNT FOR 170 NULLS 10$: BIS #WAIT,U.CW2(R5) ;ASSUME WAIT FOR DEVICE OFF LINE TST @S.CSR(R4) ;DEVICE OFF LINE? BMI 80$ ;IF MI YES 20$: BIC #WAIT,U.CW2(R5) ;DEVICE ON LINE, CLEAR WAIT CONDITION MOVB S.ITM(R4),S.CTM(R4) ;SET TIMEOUT COUNT MOV #100,@S.CSR(R4) ;ENABLE INTERRUPTS ; ; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUSES ; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDITION ; THAT COULD EXIST IN RESTARTING THE I/O OPERATION ; PPPWF: RETURN ; ;+ ; **-$PPINT-PC11 PAPER TAPE PUNCH CONTROLLER INTERUPTS ;- $PPINT:: ;;;REF LABEL INTSV$ PP,PR4,P$$P11 ;;;GENERATE INTERRUPT SAVE CODE MOV U.SCB(R5),R4 ;;;GET ADDRESS OF STATUS CONTROL BLOCK MOVB S.ITM(R4),S.CTM(R4) ;;;RESET TIMEOUT COUNT MOV S.CSR(R4),R4 ;;;POINT R4 TO CONTROL STATUS REGISTER MOV (R4)+,U.CW3(R5) ;;;SAVE STATUS BMI 60$ ;;;IF MI, ERROR SUB #1,U.CNT(R5) ;;;DECREMENT CHARACTER COUNT BCS 50$ ;;;IF CS, THEN DONE TSTB U.CW2(R5) ;;;CURRENTLY PUNCHING TRAILER? BPL 30$ ;;;IF PL NO CLRB (R4) ;;;LOAD NULL INTO OUTPUT REGISTER BR 40$ ;;;BRANCH TO LOAD IT 30$: CALL $GTBYT ;;;GET NEXT BYTE FROM USER BUFFER MOVB (SP)+,(R4) ;;;LOAD BYTE INTO OUTPUT REGISTER 40$: JMP $INTXT ;;;EXIT FROM INTERRUPT 50$: INC U.CNT(R5) ;;;RESET BYTE COUNT 60$: CLR -(R4) ;;;DISABLE PUNCH INTERRUPTS CALL $FORK ;;;CREATE SYSTEM PROCESS MOV U.SCB(R5),R4 ;POINT R4 TO SCB MOV S.PKT(R4),R1 ;POINT R1 TO I/O PACKET MOV I.PRM+4(R1),R1 ; AND PICK UP CHARACTER COUNT SUB U.CNT(R5),R1 ;CALCULATE CHARACTERS TRANSFERRED MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFER TST U.CW3(R5) ;DEVICE ERROR? BPL 70$ ;IF PL NO 65$: MOV #IE.VER&377,R0 ;UNRECOVERABLE HARDWARE ERROR CODE 70$: CALL $IODON ;INITIATE I/O COMPLETION BR PPINI ;BRANCH BACK FOR NEXT REQUEST ; ; DEVICE TIMEOUT RESULTS IN A NOT READY MESSAGE BEING PUT OUT 4 TIMES A ; MINUTE. TIMEOUTS ARE CAUSED BY POWERFAILURE AND PUNCH FAULT CONDITIONS. ; PPOUT: CLRB @S.CSR(R4) ;;;DISABLE PUNCH INTERRUPT MTPS #0 ;;;ALLOW INTERRUPTS 80$: MOV #IE.DNR&377,R0 ;ASSUME DEVICE NOT READY ERROR MOV U.CW2(R5),R1 ;ARE WE WAITING FOR DEVICE READY? BPL 70$ ;IF PL NO, TERMINATE I/O REQUEST MOV #IE.ABO&377,R0 ;ASSUME REQUEST IS TO BE ABORTED ASL R1 ;ABORT REQUEST? BMI 70$ ;IF MI YES TST @S.CSR(R4) ;PUNCH READY? BPL 20$ ;IF PL YES MOV #T.NDNR,R0 ;SET FOR NOT READY MESSAGE MOVB #1,S.CTM(R4) ;SET TIMEOUT FOR 1 SECOND DECB S.STS(R4) ;TIME TO OUTPUT MESSAGE? BNE PPPWF ;IF NE NO MOVB #15.,S.STS(R4) ;SET TO OUTPUT NEXT MESSAGE IN 15. SECONDS CALLR $DVMSG ;OUTPUT MESSAGE .DSABL LSB ; ; CANCEL I/O OPERATION-FORCE I/O TO COMPLETE IF DEVICE IS NOT READY ; PPCAN: CMP R1,I.TCB(R0) ;;;REQUEST FOR CURRENT TASK? BNE 10$ ;;;IF NE NO BIS #ABORT,U.CW2(R5) ;;;SET FOR ABORT IF DEVICE NOT READY 10$: RETURN ;;; .END